package com.lcm.basic.p6.gc;

/**
 * @author Coder-lcm
 * @date 2021/4/3
 *
 * 前置知识，一般垃圾回收器在清理一个失活（去活） / 失去引用de对象前，都会调用对象的finalize方法（来自父类Object，一般会重写他用于清理资源）
 *     注意（1）finalize何时被调用是否被调用具有不确定性，所以说不要把该方法识做为一定会执行的方法
 *        （2）如果在finalize里将一个失活对象重新引用了，可以让该对象重新变成了激活状态（即不会被垃圾回收器回收）
 *        （3）Jvm执行力finalize方法过程若出现异常，系统也不会报告异常，而是继续执行gc
 *
 */
public class FinalizeToSaveObjectDemo {
    private static FinalizeToSaveObjectDemo instance = null;

    private void info(){
        System.out.println("info: " + this);
    }

    public static void main(String[] args) throws InterruptedException {
        new FinalizeToSaveObjectDemo();
        System.gc(); //(1)
        /**
         *  因为（1）步骤，GC操作并不是立即执行的，所以（3）步骤会报空指针异常，因为在执行到（3）的时候，还没进行GC操作（还没调用finalize（）方法去激活对象）
         *      所以，在此模拟用线程睡眠来等待GC完成
         */
        Thread.sleep(2000); //(2)
        instance.info();  //(3)
    }

    @Override
    public void finalize(){
        /**
         * 尝试重新激活当前对象
         */
        instance = this;
        System.out.println("当前对象："+this);
    }

}

